(其他)透過yml設定檔注入參數至特定資料結構


目的:同標題1樣,方可進行其他設定或用途

必須知識:

  • java 8
  • spring系列

材料:

  1. yml
  2. 自定義資料結構 與設定檔

第1步:
我們先來想想需要什麼的資訊放在yml
此篇與「SpringBoot使用jms聆聽多個MQ(依據yml動態新增)」有關聯
採用這篇會用的資訊來做說明

```
mqList:
  - concurrency: "10-100"
    receive-timeout: -1
    queueManager: 自定義佇列管理者
    channel: 自定義頻道
    connName: host(ip)
    user:
    destination: 目標佇列名稱
  - concurrency: "10-100"
    receive-timeout: -1
    queueManager: 自定義佇列管理者
    channel: 自定義頻道
    connName: host(ip)
    user:
    destination: 目標佇列名稱
```

mqList為所有資訊的頭
-為1個完整資訊的頭
1個完整資訊底下有7個參數
這就是我們的yml

第2步:
我們要開始定義資料結構
這結構至少要和yml一模一樣的結構

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
@Getter
@Setter
public class MQInfoConfiguration {

    // 為所有資訊的頭因此名稱為mqList
    // 每1組資訊都有7個參數的資料結構 稱為 MQInfo
    public List<MQInfo> mqList; 

    @Getter
    @Setter
    public static class MQInfo { // 這邊就根據我們要的7個屬性做設定
        public String concurrency;
        public int receiveTimeout;
        public String queueManager;
        public String channel;
        public String connName;
        public String user;
        public String destination;
    }
}

最後:
我們要進行注入與資料設定
以下是虛擬碼

     @Autowired
    MQInfoConMQInfoConfiguration mQInfoConfiguration;

    public void setMQ(Dto dto) {
            //  如果yml資訊有存在繼續進行
            if (CollectionUtils.isNotEmpty(mQInfoConfiguration.getMqList())) {
                int i = 0;
                // 跟據每1組資訊進行設定
                for (MQInfo.MQInfo mQInfo : mQInfoConfiguration.getMqList()) {
                    Factory factory = this.doSth(
                            mQInfo.getQueueManager(),
                            mQInfo.getChannel(),
                            mQInfo.getConnName()
                    );
                    ...
                    }

補充:
這邊給大家幾個不一樣的形式

(1)
yml都不變
透過@Value注入到變數
程式變得很攏長,且每個變數其實是獨立的,只有當看到@Value取用yml的路徑才會知到是有關聯的
因此不建議這樣注入

(2)
最上方跟大家介紹的模式演變是透過現在要介紹的

@Autowired(required= false)
MQInfoConMQInfoConfiguration mQInfoConfiguration = new MQInfoConMQInfoConfiguration();

public init(){
List<MQInfo> mqList = new ArraryList<>();
MqInfo mqInfo = new MqInfo();
mqInfo.setChannel("123");
...
// set the others
...
mqList.add(mqInfo);

MqInfo mqInfo2 = new MqInfo();
...
mqList.add(mqInfo2);

// 最後在set mQInfoConfiguration
mQInfoConfiguration.setMqList(mqList);

}

// 這邊設定參數 部份操作是1樣的
public void setMQ(Dto dto) {
            //  如果yml資訊有存在繼續進行
            if (CollectionUtils.isNotEmpty(mQInfoConfiguration.getMqList())) {
                int i = 0;
                // 跟據每1組資訊進行設定
                for (MQInfo.MQInfo mQInfo : mQInfoConfiguration.getMqList()) {
                    Factory factory = this.doSth(
                            mQInfo.getQueueManager(),
                            mQInfo.getChannel(),
                            mQInfo.getConnName()
                    );
                    ...
                    }

ref:

  1. YAML to List of Objects in Spring Boot
  2. Guide to @ConfigurationProperties in Spring Boot

主要是給自己的一個紀錄,也分享給有需要的夥伴
註解部分有提及一些參考的連結,有興趣可以點進去看看喔

這是一個心血來潮,產生的文章
若有喜歡或交流的部分都歡迎在下方留言,多多關照。

#spring boot #yml #config







你可能感興趣的文章

抓封包工具(wireshark) 指令相關用法

抓封包工具(wireshark) 指令相關用法

Performance Analysis

Performance Analysis

How to Set Up Firewall with UFW on Ubuntu 20.04

How to Set Up Firewall with UFW on Ubuntu 20.04






留言討論